package test5

import (
	"fmt"
	"log"
	"net/http"
	"time"
)

func validateAuth(s string) error {
	if s != "123456" {
		return fmt.Errorf("%s", "bad auth token")
	}
	return nil
}

func greetings(w http.ResponseWriter, r *http.Request) {
	log.Println("greetings")
	fmt.Fprintf(w, "欢迎！")
}
// 接收接口， 返回接口
func logHandler(h http.Handler) http.Handler {
	log.Println("logHandler")
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		t := time.Now()
		log.Printf("[%s] %q %v\n", r.Method, r.URL.String(), t)
		h.ServeHTTP(w, r)
	})
}

func authHandler(h http.Handler) http.Handler {
	log.Println("authHandler")
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		err := validateAuth(r.Header.Get("auth"))
		if err != nil {
			http.Error(w, "bad auth param", http.StatusUnauthorized)
		}
		h.ServeHTTP(w, r)
	})
}
func Test1() {
	// 第二个参数是接口类型， 实现了 ServeHTTP 方法
	// http.HandlerFunc(greetings) 将普通函数变为实现了 ServeHTTP方法的函数类型
	// authHandler 接收实现了此接口类型的 任意类型实例，在响应前，对 w 和 r 做出额外操作
	// logHandler接收实现了此接口的任意类型，在返回前做出额外操作
	http.ListenAndServe(":9999", logHandler(authHandler(http.HandlerFunc(greetings))))
}
